var util = require('util');
var net = require('net');

var Debug = function(options) {
	options = options || {};
	var self = this;
	
	this.mode = options.mode || 'console';
	this.level = options.level || 'warn';
	
	if(this.mode == 'net') {
		this.port = options.port || 9002;
		this.clients = [];
		
		this.server = net.createServer();
		this.server.on('connection', function(socket) {
			self.debug("Debug CLient Connected");
			socket.on('data', function(data){
			});
			
			var position = self.clients.push(socket) - 1;
			socket.on('end', function() {
				self.clients.splice(position, 1);
			});
		});
		
		this.server.listen(this.port);
	}
};

Debug.prototype.debug = function(o) {
	switch(this.level) {
	case 'debug':
		message(this, o);
		break;
		
	default:
		return;
	}
};

Debug.prototype.log = function(o) {
	switch(this.level) {
	case 'log':
	case 'debug':
		message(this, o);
		break;
		
	default:
		return;
	}
};

Debug.prototype.warn = function(o) {
	switch(this.level) {
	case 'warn':
	case 'log':
	case 'debug':
		message(this, o);
		break;
		
	default:
		return;
	}
};

Debug.prototype.error = function(o) {
	switch(this.level) {
	case 'error':
	case 'warn':
	case 'log':
	case 'debug':
		message(this, o);
		break;
		
	default:
		return;
	}
};

function message(debug, msg) {
	switch(typeof(msg)) {
	case 'string':
		break;
		
	case 'object':
	default:
		msg =  util.inspect(o, false, null, true);
	}
	
	
	switch(debug.mode) {
	case 'console':
		console.log(msg);
		break;
		
	case 'net':
		for(var c = 0; c < debug.clients.length; c++) {
			debug.clients[c].write(msg + "\r\n");
		}
		break;
		
	default:
		return;
	}
}

module.exports = Debug;
